package com.example.cc.server.rabbitmq;

import com.example.cc.common.dto.ChangeEventMessage;
import com.example.cc.common.enums.ConfigActionEnum;
import com.example.cc.common.rabbitmq.RabbitConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 配置变更事件发布者，用于将配置变更信息发送到 RabbitMQ
 * 有两种实现，WebSocket 和 消息队列，这里是消息队列的方式。
 */
@Component
@Slf4j
public class ConfigEventPublisher {

    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public ConfigEventPublisher(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    /**
     * 发布配置变更事件到 RabbitMQ
     *
     * @param key    配置项的键
     * @param action 操作类型
     * @param value  配置项的值
     */
    public void publish(String key, ConfigActionEnum action, Object value) {
        ChangeEventMessage message = ChangeEventMessage.builder()
                .key(key)
                .action(action)
                .value(value)
                .build();
        // 组装 routingKey，格式为：{clientId}.{action}.{updateItem}，例如：shopping-cart.update.item
        // 这里的是 "shopping-cart"是clientId，应该让接口传递过来
        String routingKey = String.format(RabbitConstants.ROUTING_KEY_PATTERN, "shopping-cart", action.getAction(), key);
        rabbitTemplate.convertAndSend(RabbitConstants.EXCHANGE_NAME, routingKey, message);
        log.info("配置变更发布消息到 Exchange={}，routingKey={}", RabbitConstants.EXCHANGE_NAME, routingKey);
    }

}
